#include "EventLoopThreadPoll.h"
#include "EvenLoopThread.h"
  
    
EventLoopThreadPoll::EventLoopThreadPoll(EventLoop* baseLoop,const std::string &nameArg)
    :baseLoop_(baseLoop)
    ,name_(nameArg)
    ,started_(false)
    ,numThreads_(0)
    ,next_(0)
{}

EventLoopThreadPoll::~EventLoopThreadPoll()
{}


void EventLoopThreadPoll::start(const ThreadInitCallback& cb)
{
    started_ = true;

    for(int i = 0;i < numThreads_; ++i)
    {
        char buf[name_.size() + 32];// 线程池的名字+32
        snprintf(buf,sizeof buf,"%s%d",name_.c_str(),i);// 作为线程名
        EventLoopThread* t = new EventLoopThread(cb,buf);
        threads_.push_back(std::unique_ptr<EventLoopThread>(t));
        loops_.push_back(t->startLoop()); // 底层创建线程，绑定一个新的EventLoop，并返回该loop的地址
    }

    // 如果没有setThreadNum(int numThreads)
    // 整个服务端只有一个线程，运行着baseloop
    if(numThreads_ == 0 && cb)
    {
        cb(baseLoop_);// 如果设置了cb，那么就回调一下
    }
}

// 如果是多线程中，baseLoop_默认以轮询的方式分配channel给subloop
EventLoop* EventLoopThreadPoll::getNextLoop()
{
    EventLoop* loop = baseLoop_;

    if(!loops_.empty()) // 通过轮询获取下一个处理事件的loop
    {
        loop = loops_[next_];
        ++next_;
        if(next_ >= loops_.size())
        {
            next_ = 0;
        }
    }

    return loop;
}

std::vector<EventLoop*> EventLoopThreadPoll::getAllLoops()
{
    if(loops_.empty())
    {
        return std::vector<EventLoop*>(1,baseLoop_);
    }
    else
    {
        loops_;
    }
}
